<?php

/******** 对数组中的各个元素应用一个函数 ******/

// 问题：希望对数组中的各个元素应用一个函数或方法，这就允许一次转换所有输入数据

// 解决方案

/****************************
 * array_walk()
 * 只有 array 的值才 可以被改变，用户不应在回调函数中改变该数组本身的结构。如增加/删除单元，unset单元等等，这会造成不可预期的错误
 */

$names = array('firstName' => 'Baba',
    'lastName' => "o riley");

array_walk($names, function (&$value, $key) {
    $value = htmlentities($value, ENT_QUOTES);
});

foreach ($names as $name) {
    print "$name \n";
}

$fruits = ['d' => 'lemon', 'a' => 'orange', 'b' => 'banana', 'c' => 'apple'];

function test_alter(&$item1, $key, $prefix)
{
    $item1 = "$prefix:$item1";
}

function test_print($item2, $key)
{
    echo "$key. $item2<br/> \n";
}

echo "Before ...:\n";
array_walk($fruits, 'test_print');

array_walk($fruits, 'test_alter', 'fruit');
echo "... and after:\n";

array_walk($fruits, 'test_print');

// 对于嵌套数据，可以使用 array_walk_recursive()

$names1 = ['firstNames' => ['Baba', 'Bill'],
    'lastNames' => ["O'Riley", "0'Reilly"]
];

array_walk_recursive($names1,function(&$value,$key){
    $value = "$key:$value";
});

foreach ($names1 as $nametypes){
    foreach ($nametypes as $name){
        print "$name\n";
    }
}